/*
 * @Author: wenbo
 * @Date: 2021-10-09 15:40:01
 * @LastEditTime: 2021-10-12 17:53:32
 * @LastEditors: Please set LastEditors
 * @Description: shihlin-sc3 series motor driver
 * @FilePath: \X\1km\driver\transducer\shihlin_sc3.h
 */
#ifndef __SHIHLIN_H
#define __SHIHLIN_H

#include "../../bsp/bsp.h"


#define ADDR_OP_MODE       	0x1000      //操作模式
#define ADDR_STATE          0x1001      //状态
#define ADDR_CURRENT        0x1004      //电流
#define ADDR_ERROR_CODE     0x1007      //错误码
#define ADDR_CLEAR_ERROR    0x1101      //清除错误
#define ADDR_STAGE_SPEED_1  (400+10000) //段速1
#define ADDR_STAGE_SPEED_5  (404+10000) //段速5
#define ADDR_STAGE_SPEED_6  (405+10000) //段速6
#define ADDR_STAGE_SPEED_7  (406+10000) //段速7

typedef struct{
    int16_t     current;			    //驱动器电流
	uint32_t	errorCode;				//错误Code
    union {
	    uint16_t u16Info;
        struct{
            uint16_t    isRunning           : 1;    //b0：运行
            uint16_t    isForward           : 1;    //b1：正转时
            uint16_t    isReverse           : 1;    //b2：反转时
            uint16_t    isfreqArrive        : 1;    //b3：频率到达
            uint16_t    isOverload          : 1;    //b4：过载
            uint16_t    isParemResetEnd     : 1;    //b5：参数复位结束
            uint16_t    freqDetect          : 1;    //b6：频率检测
            uint16_t    isAlarmOccurred     : 1;    //b7：发生报警
            uint16_t    resvertBit8         : 1;    //b8：保留
            uint16_t    resvertBit9         : 1;    //b9：保留
            uint16_t    resvertBit10        : 1;    //b10：保留
            uint16_t    stateE0             : 1;    //b11：变频器E0状态
            uint16_t    resvertBit12        : 1;    //b12：保留
            uint16_t    resvertBit13        : 1;    //b13：保留
            uint16_t    isResetting         : 1;    //b14：变频器复位期间
            uint16_t    isTuning            : 1;    //b15：调谐中
        }Bit;
    }state;
}Type_Shihlin_Param_Def;

typedef struct{
	uint8_t 	slave_id;    		    //modbus slave id
	uint8_t 	port;    			    //modbus uart port
    uint32_t 	speed;   			    //modbus uart speed
    uint8_t 	rec_data[20];    	    //modbus recive buffer
    uint8_t 	rec_len; 			    //modbus recive data length
}Type_Shihlin_Com_Def;

typedef struct
{
	uint16_t		mode;               //变频器操作模式
    bool            isInitOk;
	Type_Shihlin_Com_Def 	com;
	
    Type_GPIO_Def   gpio_STF;
    Type_GPIO_Def   gpio_STR;
    Type_GPIO_Def   gpio_M0;
    Type_GPIO_Def   gpio_M1;
    Type_GPIO_Def   gpio_FAULT;        

	Type_Shihlin_Param_Def 	param;
}Type_Shihlin_Def;


/**
 * @description: 初始化士林变频器
 * @param {Type_Shihlin_Def} pList  :变频器列表
 * @param {uint8_t} listLen         :变频器列表长度
 * @return {bool}                   :初始化成功返回true
 */
extern bool xp_shihlin_init(Type_Shihlin_Def * const pList, uint8_t listLen);

/**
 * @description: 驱动卸载
 * @return {bool}                   :卸载成功返回true
 */
extern bool xp_shihlin_Deinit(void);

/**
 * @description: 士林变频器设置运转
 * @param {uint8_t} devId           :变频器编号(此编号非驱动器slave id)
 * @param {Type_Speed_Enum} speed   :速度级别参数,正负控制方向,为0则停止
 * @return {bool}                   :设置成功返回true
 */
extern bool xp_shihlin_run(uint8_t devId, int speed);
extern bool xp_shihlin_run_board_crl(uint8_t devId, int speed, bool isMovePos, int32_t pos);

/**
 * @description: 获取变频器错误码
 * @param {int} devId               :变频器序号
 * @param {uint32_t} *pResult       :返回结果
 * @return {bool}                   :设置成功返回true
 */
extern bool xp_shihlin_get_error_code(int devId, uint32_t *pResult);

/**
 * @description: 获取变频器电流
 * @param {int} devId               :变频器序号
 * @return {bool}                   :设置成功返回true
 */
extern bool xp_shihlin_get_current(int devId, int16_t *pResult);

/**
 * @description: 获取变频器状态
 * @param {int} devId               :变频器序号
 * @param {uint32_t} *pResult       :返回结果
 * @return {bool}                   :设置成功返回true
 */
bool xp_shihlin_get_state(int devId, uint16_t *pResult);

/**
 * @description: 清除驱动器错误
 * @param {int}                     :变频器序号 
 * @return {bool}                   :设置成功返回true
 */
extern bool xp_shihlin_clear_error(int devId);

/**
 * @description: 设置1567段速(通过M0 M1 IO选择预置速度)
 * @param {int}                     :变频器序号 
 * @param {uint16_t}                :段速1
 * @param {uint16_t}                :段速5
 * @param {uint16_t}                :段速6
 * @param {uint16_t}                :段速7
 * @return {bool}                   :设置成功返回true
 */
extern bool xp_shihlin_set_stage_speed(int devId, uint16_t speed_1, uint16_t speed_5, uint16_t speed_6, uint16_t speed_7);
#endif